package com.marketing.tenant.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.marketing.tenant.entity.TenantSubscription;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 租户订阅服务接口
 * 
 * @author Marketing System
 * @since 2024-09-25
 */
public interface TenantSubscriptionService {
    
    /**
     * 创建订阅
     * 
     * @param subscription 订阅信息
     * @return 创建是否成功
     */
    boolean createSubscription(TenantSubscription subscription);
    
    /**
     * 租户订阅计划
     * 
     * @param tenantId 租户ID
     * @param planId 计划ID
     * @param months 订阅月数
     * @return 订阅信息
     */
    TenantSubscription subscribePlan(Long tenantId, Long planId, Integer months);
    
    /**
     * 续费订阅
     * 
     * @param tenantId 租户ID
     * @param months 续费月数
     * @return 操作是否成功
     */
    boolean renewSubscription(Long tenantId, Integer months);
    
    /**
     * 升级订阅计划
     * 
     * @param tenantId 租户ID
     * @param newPlanId 新计划ID
     * @return 操作是否成功
     */
    boolean upgradeSubscription(Long tenantId, Long newPlanId);
    
    /**
     * 降级订阅计划
     * 
     * @param tenantId 租户ID
     * @param newPlanId 新计划ID
     * @return 操作是否成功
     */
    boolean downgradeSubscription(Long tenantId, Long newPlanId);
    
    /**
     * 取消订阅
     * 
     * @param tenantId 租户ID
     * @return 操作是否成功
     */
    boolean cancelSubscription(Long tenantId);
    
    /**
     * 暂停订阅
     * 
     * @param tenantId 租户ID
     * @return 操作是否成功
     */
    boolean pauseSubscription(Long tenantId);
    
    /**
     * 恢复订阅
     * 
     * @param tenantId 租户ID
     * @return 操作是否成功
     */
    boolean resumeSubscription(Long tenantId);
    
    /**
     * 获取租户当前订阅
     * 
     * @param tenantId 租户ID
     * @return 当前订阅
     */
    TenantSubscription getCurrentSubscription(Long tenantId);
    
    /**
     * 查询租户订阅历史
     * 
     * @param page 分页参数
     * @param tenantId 租户ID
     * @return 订阅历史分页结果
     */
    IPage<TenantSubscription> getSubscriptionHistory(Page<TenantSubscription> page, Long tenantId);
    
    /**
     * 获取即将到期的订阅
     * 
     * @return 即将到期的订阅列表
     */
    List<TenantSubscription> getExpiringSubscriptions();
    
    /**
     * 获取已过期的订阅
     * 
     * @return 已过期的订阅列表
     */
    List<TenantSubscription> getExpiredSubscriptions();
    
    /**
     * 处理过期订阅
     * 
     * @return 处理数量
     */
    int processExpiredSubscriptions();
    
    /**
     * 检查租户是否有有效订阅
     * 
     * @param tenantId 租户ID
     * @return 是否有有效订阅
     */
    boolean hasActiveSubscription(Long tenantId);
    
    /**
     * 检查租户是否有指定功能权限
     * 
     * @param tenantId 租户ID
     * @param feature 功能名称
     * @return 是否有权限
     */
    boolean hasFeatureAccess(Long tenantId, String feature);
    
    /**
     * 获取租户使用限制
     * 
     * @param tenantId 租户ID
     * @param limitType 限制类型
     * @return 限制值
     */
    Integer getUsageLimit(Long tenantId, String limitType);
    
    /**
     * 查询订阅数据统计
     * 
     * @param planId 计划ID（可选）
     * @param startDate 开始时间
     * @param endDate 结束时间
     * @return 统计数据
     */
    Object getSubscriptionStats(Long planId, LocalDateTime startDate, LocalDateTime endDate);
}